FreeRTOS 任务的创建与删除

FreeRTOS的任务函数原型为:

1void task(void* args);

使用FreeRTOS的xTaskCreate函数来创建任务:

1#include <task.h>
2BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,
3             const char * const pcName,
4            const uint16_t usStackDepth,
5            void * const pvParameters,
6            UBaseType_t uxPriority,
7            TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;
8//返回值:成功返回pdPASS;失败返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
  • pxTaskCode是任务函数,没有返回值(void),参数为void*
  • pcName是任务的名字,用于调试,其长度不能超过configMAX_TASK_NAME_LEN
  • usStackDepth是任务的堆栈深度,其四倍即是堆栈的大小(字节数)
  • pvParameters是传给任务函数的参数
  • uxPriority是任务优先级,数值越大,优先级越高,0为最低优先级
  • pxCreatedTask是返回的任务句柄

使用vTaskStartScheduler函数来开启任务调度:

1#include <task.h>
2void vTaskStartScheduler(void);

FreeRTOS的任务函数不能返回,对于不再需要的任务,应当使用vTaskDelete函数来进行删除,其参数是xTaskCreate最后一个参数返回的任务句柄,将参数设为NULL表示删除当前任务:

1#include <task.h>
2void vTaskDelete(TaskHandle_t xTaskToDelete);

下面是一个例子,创建两个任务,通过串口打印消息:

1#include <stm32f4xx.h>
2#include <FreeRTOS.h>
3#include <task.h>
4#include <uart.h>
5 
6void task1(void* args);
7void task2(void* args);
8 
9int main()
10{
11    //配置USART1
12    USART1_Config();
13    //创建任务
14    TaskHandle_t h1,h2;
15    xTaskCreate(task1,"task1",configMINIMAL_STACK_SIZE,"hello\n",1,&h1);
16    xTaskCreate(task2,"task2",configMINIMAL_STACK_SIZE,"world\n",1,&h2);
17    //开启任务调度
18    vTaskStartScheduler();
19    while(1);
20}
21 
22 
23void task1(void* args)
24{
25    int i = 0;
26    while(1)
27    {
28        //循环5次后删除自己
29        if(i >= 5)
30        {
31            vTaskDelete(NULL);
32        }
33        //打印参数
34        USART_printf(USART1,args);
35        //延时1000ms
36        vTaskDelay(1000/portTICK_RATE_MS);
37        i++;
38    }
39}
40 
41void task2(void* args)
42{
43    int i = 0;
44    while(1)
45    {
46        //循环10次后删除自己
47        if(i >= 10)
48        {
49            vTaskDelete(NULL);
50        }
51        //打印参数
52        USART_printf(USART1,args);
53        //延时1000ms
54        vTaskDelay(1000/portTICK_RATE_MS);
55        i++;
56    }
57}

Image

附.USART代码代码 :

1/**
2  * @file       uart.c
3  * @author     PlanC
4  * @blog       www.kurukurumi.com
5  * @brief      configure USART1 to print message
6  */
7 
8#include <stdarg.h>
9#include <stdio.h>
10#include <stm32f4xx.h>
11#include <uart.h>
12 
13/**
14  * @brief  Initialize the USART1
15  * @note   set USART1_RX GPIOA10 as push-pull output
16  *           set USART1_TX GPIOA9 as pull-up input
17  *           set USART1 as 115200-8-N-1
18  */
19void USART1_Config(void)
20{
21    GPIO_InitTypeDef gpio;
22    USART_InitTypeDef usart;
23     
24    // enable the perpheral clock
25    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
26    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
27     
28    gpio.GPIO_Mode = GPIO_Mode_AF;
29    gpio.GPIO_PuPd = GPIO_PuPd_UP;
30    gpio.GPIO_OType = GPIO_OType_PP;
31    gpio.GPIO_Speed = GPIO_High_Speed;
32     
33    //set UART1_RX GPIOA10 as push-pull output
34    gpio.GPIO_Pin = GPIO_Pin_10;
35    GPIO_Init(GPIOA,&gpio);
36    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
37     
38    //set UART1_TX GPIOA9 as pull-up input
39    gpio.GPIO_Pin = GPIO_Pin_9;
40    GPIO_Init(GPIOA,&gpio);
41    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
42     
43    //set USART1 as 115200-8-N-1
44    usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
45    usart.USART_BaudRate = 115200;
46    usart.USART_WordLength = USART_WordLength_8b;
47    usart.USART_Parity = USART_Parity_No;
48    usart.USART_StopBits = USART_StopBits_1;
49    USART_Init(USART1,&usart);
50    USART_Cmd(USART1,ENABLE);
51}
52 
53 
54/**
55  * @brief  Send a byte data from USART
56  * @param  port: the USART which will be used
57  * @param  data: the data which will be sent
58  */
59 
60void USART_WriteByte(USART_TypeDef* port,uint8_t data)
61{
62    USART_SendData(port,data);
63    while(USART_GetFlagStatus(port,USART_FLAG_TXE) == RESET);
64}
65 
66 
67/**
68  * @brief  print a format string from USART
69  * @param  port: the USART which will be used
70  * @param  fmt: the format string
71  *
72  */
73 
74#define USART_PRINTF_BUFFER_SIZE 256
75 
76int USART_printf(USART_TypeDef* port,const char* fmt,...)
77{
78    char str[USART_PRINTF_BUFFER_SIZE];
79    int length,index;
80    va_list argList;
81    va_start(argList,fmt);
82    length = vsnprintf(str,USART_PRINTF_BUFFER_SIZE-1,fmt,argList);
83    va_end(argList);
84    for(index = 0 ; index < length ; index++)
85    {
86        USART_WriteByte(port,str[index]);
87    }
88    return length;
89}